using Microsoft.AspNetCore.Mvc;     // 因为ControllerBase等需要引入
using MyWebApi.Api.Entity;      // 因为Users表需要引入
using System.Collections.Generic;   // 因为泛型需要引入
using System.Linq;     // 因为Where 引入之后我们可以使用一种类似SQL的语法来查询任何形式的数据
using System;
using MyWebApi.Api.Repository;
using MyWebApi.Api.ParamModel;
using MyWebApi.Api.Utils;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Authorization;

namespace MyWebApi.Api.Controllers
{
    // 特性
    [Authorize]  // [Authorize]下的所有Api接口如：查询、删除、创建用户不能匿名访问，需要Token令牌才可访问
    [ApiController]
    [Route("[controller]")]
    
    public class UsersController : ControllerBase
    {

        // 实例化数据库
        // private MyWebApi.Api.Db.MyWebApiDb db = new Db.MyWebApiDb();

        // 定义为IRepository<T>的泛型接口未知数 T 为 Users
        private IRepository<Users> _usersRespository;   // 现在_usersRespository里包含IRepository<T>泛型接口里面的属性(可以使用这些属性来进行对Users表的操作)

        private TokenParameter _tokenParameter;

        private readonly IConfiguration _configuration;


        // 一个构造函数：初始化UsersController控制器，使该控制器一开始就有以下的属性
        public UsersController(IConfiguration configuration, IRepository<Users> usersRespository)
        {
            _configuration = configuration;
            _tokenParameter = _configuration.GetSection("tokenParameter").Get<TokenParameter>();

            _usersRespository = usersRespository;
        }

        // Users所有用户封装
        private IEnumerable<Users> GetUsers()
        {
            var users = new List<Users>{
               new Users {
                   Id = 1,
                   UserName = "xiaopang",
                   Password = "123"
               },
               new Users {
                   Id = 2,
                   UserName = "小胖",
                   Password = "123"
               },
               new Users {
                   Id = 3,
                   UserName = "小小胖",
                   Password = "123"
               }
           };
            return users;
        }


        // 查询所有用户
        [HttpGet]
        public dynamic Get()
        {
            // 查询所有用户
            var users = _usersRespository.Table.ToList();

            // 测试文件test.http需要
            // var users = GetUsers();
            return users;
        }

        // 根据id查用户
        [HttpGet("{id}")]
        public dynamic Get(int id)
        {

            var user = _usersRespository.GetById(id);

            if (user == null)
            {
                // 指定id用户不存在

                // 测试文件test.http需要
                // var users = GetUsers();
                // var user = users.Where(x => x.Id == id).FirstOrDefault();
                return new
                {
                    Code = 1001,
                    Data = user,
                    Msg = "指定id用户不存在"
                };
            }
            else
            {
                // 测试文件test.http需要
                // var users = GetUsers();
                // var user = users.Where(x => x.Id == id).FirstOrDefault();
                return new
                {
                    Code = 1000,
                    Data = user,
                    Msg = "查询指定用户成功"
                };
            }


        }

        // 创建用户
        [AllowAnonymous]    // 该Api接口可以不用令牌匿名访问
        [HttpPost]
        public dynamic Post(UserModel model)
        {     // model 储存数据的参数

            var user = new Users
            {
                UserName = model.UserName,
                Password = model.Password
            };

            _usersRespository.Insert(user);

            // 测试文件test.http需要
            return new
            {
                Code = 1000,
                Data = model,
                msg = "创建用户成功"
            };
        }

        // 根据id修改用户
        [HttpPut("{id}")]
        public dynamic Put(int id, UserModel model)
        {

            var user = _usersRespository.GetById(id);

            if (user != null)
            {
                user.UserName = model.UserName;
                user.Password = model.Password;
                user.UpdatedTime = DateTime.Now;

                _usersRespository.Update(user);

                // 测试文件test.http需要
                return new
                {
                    Code = 1000,
                    msg = string.Format("修改id为：{0} 的用户", id)
                };
            }
            else
            {

                // 测试文件test.http需要
                return new
                {
                    Code = 101,
                    msg = string.Format("修改id为：{0} 的用户失败,用户不存在", id)
                };
            }


        }

        // 根据id删除用户
        [HttpDelete("{id}")]
        public dynamic Delete(int id)
        {

            var user = _usersRespository.GetById(id);

            if (user != null)
            {
                _usersRespository.Delete(id);

                // 测试文件需要
                return new
                {
                    Code = 1000,
                    msg = string.Format("删除id为:{0} 用户成功", id)
                };
            }
            else
            {
                // 测试文件需要
                return new
                {
                    Code = 101,
                    msg = string.Format("删除id为:{0} 用户失败，用户不存在", id)
                };
            }

        }




        // 判断登录，登录成功并生成token
        [AllowAnonymous]    // 该Api接口可以不用令牌匿名访问
        [HttpPost, Route("token")]
        public dynamic GetToken(UserModel model)
        {     // model 储存数据的参数

            var userName = model.UserName.Trim();
            var password = model.Password.Trim();

            var user = _usersRespository.Table.Where(x => x.UserName == userName && x.Password == password).FirstOrDefault();

            if (user == null)
            {
                // 账号不存在
                // 测试文件test.http需要
                return new
                {
                    Code = 1001,
                    Data = user,
                    msg = "用户账号或密码不正确"
                };
            }
            else
            {
                // 账号存在，登录成功

                // 使用生成Token的方法
                var token = TokenHelper.GenerateToken(_tokenParameter, user);
                var refreshToken = 123456;

                // 测试文件test.http需要
                return new
                {
                    Code = 1000,
                    Data = new { Token = token, RefreshToken = refreshToken },
                    msg = "登录成功，保存Token"
                };
            }


        }


    }
}